#include<stdio.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

//进程程序替换
int main(int argc,char* argv[]){
  printf("process is running\n");
//exec*为啥没有成功返回值，因为成功了，就和接下来的代码无关了，判断毫无意义
//只要返回了，就一定是出错了
  
  //使用子进程去进程程序替换
  pid_t id = fork();
  assert(id!=-1);

  if(id == 0){
    //子进程
    sleep(1);
    execvp(argv[1],&argv[1]);  
    exit(1);



  //char *const argv_[] = {
  //  "ls",
  //  "-a",
  //  "-l",
  //  "--color=auto",
  //  NULL 
  //};
  
 // char *const envp_[] = {
 //  (char*)"MYENV=121413432",
 //   NULL 
 // };


    //execl("/usr/bin/ls","ls","-l",NULL);//这里的程序替换不会影响到父进程，因为进程具有独立性
    //execlp("ls","ls","-a","-l",NULL);
    //execv("/usr/bin/ls",argv_);
    //execvp("ls",argv_);
    
    //调用自己写的另一个程序
   // execl("./mybin","mybin",NULL);
  // execl("./mycpp","mycpp",NULL);
  //
   // putenv((char*)"MYENV=11111111111111111");//将本地变量变为全局环境变量
   // extern char** environ;
   // execle("./mybin","mybin",NULL,environ); //这里的MYENV是本地变量
   // exit(1);

  }
    //父进程
    int status = 0;
    pid_t ret = waitpid(id,&status,0);
    if(ret > 0){
      printf("等待成功，exit code:%d,sig:%d\n",(status>>8)&0xFF,status & 0x7F);

    }
  

  
  













 // execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);//第一个参数是要运行的命令路径，第二个是要怎么运行，就和在命令行输入一样
  
 // printf("process is done\n");//这里的printf也是一个函数，当execl调用成功，后面的代码就都被替换了，所以不会再执行这一行。
  return 0;
}
